//
//  NSString+RegularExpression.m
//
//  Created by SKY
//  Copyright © 翊sky. All rights reserved.
//

#import "NSString+RegularExpression.h"

/**

 *  []方括号表示的值必须是括号中间集合的子集，要注意的是括号里面可以有多个集合，比如[A-Z0-9a-z]表示匹配任意一个大小写字母或数字
 *
 *  表达式解析时\d这些特殊符号在我们的代码中多了一个\，这是因为\本身是转义符号，为了保证表达式能正常匹配，我们要给\进行一次转义，所以就变成了\\。基本上所有的符号字符都需要转义。
 
 值表达:
     .      匹配除换行符外的任意字符
     
     \w   匹配字母或者数字的字符
     
     \W   匹配任意不是字母或数字的字符
     
     \s    匹配任意的空白符(空格、制表符、换行符)
     
     \S    匹配任意不是空白符的字符
     
     \d    匹配任意数字
     
     \D    匹配任意非数字的字符
     
     \b    匹配单词的结尾或者开头的字符
     
     \B    匹配任意不是单词结尾或开头的字符
     
     [^x]  匹配任意非x的字符。如[^[a-z]]匹配非小写字母的任意字符
     
     ^      匹配字符串的开头
     
     $      匹配字符串的结尾
 
 修饰表达:
 
     *     匹配重复任意次数
     
     +    匹配重复一次以上的次数
     
     ?      匹配一次或零次
     
     {n}    匹配重复n次
     
     {n,}   匹配重复n次或n次以上
     
     {n,m} 匹配重复最少n次最多m次

 *
 */
@implementation NSString (RegularExpression)

/*! 判断邮箱是否正确*/

- (BOOL)validateEmail {
    
    NSString *regExp = @"^[a-zA-Z0-9]{4,}@[a-z0-9A-Z]{2,}\\.[a-zA-Z]{2,}$";
    return [self validateWithRegExp:regExp];
}

/*! 判断验证码是否正确*/

- (BOOL)validateAuthen {
    
    NSString *regExp = @"^\\d{5,6}$";
    return [self validateWithRegExp:regExp];
}

/*! 判断密码格式是否正确*/

- (BOOL)validatePassword {
    
    NSString * length = @"^\\w{6,18}$";        //长度
    
    NSString * number = @"^\\w*\\d+\\w*$";      //数字
    
    NSString * lower = @"^\\w*[a-z]+\\w*$";      //小写字母
    
    NSString * upper = @"^\\w*[A-Z]+\\w*$";    //大写字母
    
    return [self validateWithRegExp: length] && [self validateWithRegExp: number] && [self validateWithRegExp: lower] && [self validateWithRegExp: upper];
}

/*! 判断手机号码是否正确*/

- (BOOL)validatePhoneNumber {
    
    NSString *regExp = @"^1\\d{10}$";
    return [self validateWithRegExp:regExp];
}

/*! 自己写正则传入进行判断*/

- (BOOL)validateWithRegExp: (NSString *)regExp {
    
    NSPredicate * predicate = [NSPredicate predicateWithFormat: @"SELF MATCHES %@", regExp];
    return [predicate evaluateWithObject:regExp];
}

@end
